package com.example.lotterysystem.common.utils;

import ch.qos.logback.core.util.StringUtil;
import com.example.lotterysystem.common.errorcode.ServiceErrorCodeConstants;
import com.example.lotterysystem.common.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description: 基于 md5 实现的自定义加盐加密算法
 * User: Li_Xiaochi
 * Date: 2025/8/1
 * Time: 22:47
 */
public class SecurityUtil {
//    public static final Logger logger = LoggerFactory.getLogger(SecurityUtil.class);
    /**
     * 加密
     */
    public static String encrypt(String password) {
        if (!StringUtils.hasText(password)) {
            throw new ServiceException(ServiceErrorCodeConstants.PASSWORD_IS_EMPTY);
        }
        // 1. 生成盐值
        String salt = UUID.randomUUID().toString().replace("-", "");
        // md5(盐值 + password)，得到 32位16进制 的密文
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        // 数据库中应存储 盐值和密文 得到 64 位16进制 的数据
        return salt + securityPassword;
    }

    /**
     * 验证
     */
    public static boolean verify(String inputPassword, String sqlPassword) {
        // 参数校验
        if (!StringUtils.hasText(inputPassword) || !StringUtils.hasLength(sqlPassword)) {
            return false;
        }
        if (sqlPassword.length() != 64) {
            return false;
        }
        // 获取 salt
        String salt = sqlPassword.substring(0, 32);
        // md5(盐值 + password)，得到 32位16进制 的密文
        String securityPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));
//        logger.info("securityPassword: " + securityPassword + ", sqlPassword: " + sqlPassword);
        return sqlPassword.equals(salt + securityPassword);
    }
}
